package com.edu.exam.entity.examination.online;

import com.edu.exam.enums.examination.security.SessionSecurityLevel;
import com.edu.exam.enums.examination.security.AuthenticationStatus;
import com.edu.exam.enums.examination.security.AuthenticationMethod;
import com.edu.exam.enums.system.RiskLevel;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

/**
 * 会话安全实体类
 *
 * <p>会话安全实体用于管理考试会话的安全策略和监控数据，包括身份认证、
 * 防作弊检测、安全事件记录、风险评估等。确保考试会话的安全性和公平性。</p>
 *
 * <p>核心功能：
 * - 身份认证管理：多因素认证、身份验证、权限控制等
 * - 防作弊检测：异常行为检测、环境监控、设备验证等
 * - 安全事件记录：安全事件的记录、分类、统计和分析
 * - 风险评估：安全风险的评估、预警和处理
 * - 安全策略执行：动态安全策略的执行和调整</p>
 *
 * @author 系统生成
 * @version 2.0
 * @since 2025-11-09
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@EntityListeners(AuditingEntityListener.class)
public class SessionSecurity {

    /**
     * 主键ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 会话ID
     *
     * <p>关联的考试会话ID，标识安全记录所属的会话。
     * 与ExamSession实体建立一对一关系。</p>
     */
    @Column(name = "session_id", nullable = false, length = 32, unique = true)
    private String sessionId;

    /**
     * 安全级别
     *
     * <p>会话的安全级别。
     * 支持的级别：LOW（低）、MEDIUM（中）、HIGH（高）、CRITICAL（关键）</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "security_level", nullable = false, length = 20)
    private SessionSecurityLevel securityLevel = SessionSecurityLevel.MEDIUM;

    /**
     * 认证状态
     *
     * <p>身份认证的状态。
     * 支持的状态：NOT_STARTED（未开始）、IN_PROGRESS（进行中）、SUCCESS（成功）、FAILED（失败）、EXPIRED（过期）</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "auth_status", nullable = false, length = 20)
    private AuthenticationStatus authStatus = AuthenticationStatus.NOT_STARTED;

    /**
     * 认证方法
     *
     * <p>使用的身份认证方法。
     * 支持的方法：PASSWORD（密码）、FACE_RECOGNITION（人脸识别）、FINGERPRINT（指纹）、MULTI_FACTOR（多因素）等</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "auth_method", length = 30)
    private AuthenticationMethod authMethod;

    /**
     * 认证尝试次数
     *
     * <p>身份认证的尝试次数。
     * 用于监控认证异常和防止暴力破解。</p>
     */
    @Column(name = "auth_attempts")
    private Integer authAttempts = 0;

    /**
     * 最大认证尝试次数
     *
     * <p>允许的最大认证尝试次数。
     * 超过此次数将锁定认证。</p>
     */
    @Column(name = "max_auth_attempts")
    private Integer maxAuthAttempts = 5;

    /**
     * 认证开始时间
     *
     * <p>身份认证开始的时间。
     * 用于计算认证耗时和监控认证过程。</p>
     */
    @Column(name = "auth_start_time")
    private LocalDateTime authStartTime;

    /**
     * 认证完成时间
     *
     * <p>身份认证完成的时间。
     * 用于计算认证耗时和记录认证结果。</p>
     */
    @Column(name = "auth_complete_time")
    private LocalDateTime authCompleteTime;

    /**
     * 认证持续时间（秒）
     *
     * <p>身份认证的总耗时，单位为秒。
     * 由系统自动计算。</p>
     */
    @Column(name = "auth_duration_seconds")
    private Integer authDurationSeconds;

    /**
     * 风险级别
     *
     * <p>当前的安全风险级别。
     * 支持的级别：NONE（无）、LOW（低）、MEDIUM（中）、HIGH（高）、CRITICAL（关键）</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "risk_level", nullable = false, length = 20)
    private RiskLevel riskLevel = RiskLevel.NONE;

    /**
     * 风险评分
     *
     * <p>综合安全风险评分，范围0-100。
     * 数值越高表示风险越大。</p>
     */
    @Column(name = "risk_score")
    private Integer riskScore = 0;

    /**
     * 安全事件数量
     *
     * <p>记录的安全事件总数量。
     * 由系统自动统计。</p>
     */
    @Column(name = "security_event_count")
    private Integer securityEventCount = 0;

    /**
     * 违规行为数量
     *
     * <p>检测到的违规行为数量。
     * 由系统自动统计。</p>
     */
    @Column(name = "violation_count")
    private Integer violationCount = 0;

    /**
     * 安全策略配置
     *
     * <p>JSON格式的安全策略配置。
     * 包含认证策略、监控策略、防作弊策略等。</p>
     */
    @Column(name = "security_policies", columnDefinition = "TEXT")
    private String securityPolicies;

    /**
     * 防作弊配置
     *
     * <p>JSON格式的防作弊配置。
     * 包含环境监控、设备检测、行为分析等配置。</p>
     */
    @Column(name = "anti_cheating_config", columnDefinition = "TEXT")
    private String antiCheatingConfig;

    /**
     * 监控配置
     *
     * <p>JSON格式的监控配置。
     * 包含屏幕监控、摄像头监控、网络监控等配置。</p>
     */
    @Column(name = "monitoring_config", columnDefinition = "TEXT")
    private String monitoringConfig;

    /**
     * 允许的设备列表
     *
     * <p>允许参加考试的设备标识列表，JSON格式。
     * 用于设备白名单验证。</p>
     */
    @Column(name = "allowed_devices", columnDefinition = "TEXT")
    private String allowedDevices;

    /**
     * 允许的IP地址列表
     *
     * <p>允许参加考试的IP地址列表，JSON格式。
     * 用于网络访问控制。</p>
     */
    @Column(name = "allowed_ips", columnDefinition = "TEXT")
    private String allowedIps;

    /**
     * 安全令牌
     *
     * <p>会话的安全令牌，用于安全验证。
     * 在认证成功后生成。</p>
     */
    @Column(name = "security_token", length = 128)
    private String securityToken;

    /**
     * 令牌过期时间
     *
     * <p>安全令牌的过期时间。
     * 用于令牌的有效期控制。</p>
     */
    @Column(name = "token_expiry_time")
    private LocalDateTime tokenExpiryTime;

    /**
     * 最后验证时间
     *
     * <p>最后一次安全验证的时间。
     * 用于验证间隔控制和超时检测。</p>
     */
    @Column(name = "last_verification_time")
    private LocalDateTime lastVerificationTime;

    /**
     * 验证间隔（秒）
     *
     * <p>安全验证的时间间隔，单位为秒。
     * 系统将按此间隔进行安全验证。</p>
     */
    @Column(name = "verification_interval_seconds")
    private Integer verificationIntervalSeconds = 300; // 5分钟

    /**
     * 异常信息
     *
     * <p>安全相关的异常信息。
     * 记录安全异常和错误情况。</p>
     */
    @Column(name = "error_message", columnDefinition = "TEXT")
    private String errorMessage;

    /**
     * 异常代码
     *
     * <p>安全异常的错误代码。
     * 用于异常分类和快速识别。</p>
     */
    @Column(name = "error_code", length = 50)
    private String errorCode;

    /**
     * 异常发生时间
     *
     * <p>安全异常发生的具体时间。
     * 用于异常时间跟踪和分析。</p>
     */
    @Column(name = "error_time")
    private LocalDateTime errorTime;

    /**
     * 安全备注
     *
     * <p>安全相关的备注信息。
     * 记录安全事件的处理说明和特殊标记。</p>
     */
    @Column(name = "security_notes", columnDefinition = "TEXT")
    private String securityNotes;

    /**
     * 是否启用监控
     *
     * <p>标识是否启用安全监控。
     * true表示启用，false表示不启用。</p>
     */
    @Column(name = "monitoring_enabled", nullable = false)
    private Boolean monitoringEnabled = true;

    /**
     * 是否启用防作弊
     *
     * <p>标识是否启用防作弊功能。
     * true表示启用，false表示不启用。</p>
     */
    @Column(name = "anti_cheating_enabled", nullable = false)
    private Boolean antiCheatingEnabled = true;

    /**
     * 是否启用设备验证
     *
     * <p>标识是否启用设备验证。
     * true表示启用，false表示不启用。</p>
     */
    @Column(name = "device_verification_enabled", nullable = false)
    private Boolean deviceVerificationEnabled = false;

    /**
     * 是否启用网络验证
     *
     * <p>标识是否启用网络验证。
     * true表示启用，false表示不启用。</p>
     */
    @Column(name = "network_verification_enabled", nullable = false)
    private Boolean networkVerificationEnabled = false;

    // ===== 审计字段 =====

    /**
     * 创建时间
     */
    @CreatedDate
    @Column(name = "created_time", nullable = false, updatable = false)
    private LocalDateTime createdTime;

    /**
     * 更新时间
     */
    @LastModifiedDate
    @Column(name = "updated_time", nullable = false)
    private LocalDateTime updatedTime;

    // ===== 枚举引用已迁移到独立枚举类 =====

}